#ifndef CHATWINDOW_H
#define CHATWINDOW_H

//麒麟AI SDK依赖的头文件
#include <gio/gio.h>
#include <gio/giotypes.h>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <thread>
#include <vector>
#include <genai/text/chat.h>
//ui依赖的头文件
#include <QMainWindow>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QDialog>
#include <QMessageBox>
#include <QScrollBar>
#include <QDebug>
#include <QFileDialog>
#include <QTextStream>
#include <QStandardPaths>
#include <QDateTime>
#include <QFileSystemWatcher>
//chat
#include "chatconfig.h"
#include "chattextedit.h"
//speech
#include "speechmanager.h"
#include "speechsynthesizer.h"
//vision
#include "visionmanager.h"



class ChatWindow : public QMainWindow
{
    Q_OBJECT
public:
    ChatWindow(QWidget *parent = nullptr);
    ChatWindow(const ChatConfig &config, QWidget *parent = nullptr);
    ~ChatWindow();

private slots:
    void sendMessage();
    void handleCompleteResponse();
    void updateResponse(const QString &response);
    void saveChatHistory();    // 保存聊天记录
    void loadChatHistory(QString fileName);
    void onMicButtonClicked();  // 麦克风按钮点击槽函数
    void onRecognitionData();  //接收转换的文字

    void onVisionButtonClicked();  // 处理图片上传按钮点击
    void onRecognitionFinished(const QString &text);  // 图片识别完成
    void onRecognitionError(const QString &error);  // 图片识别错误

private:
    ChatConfig m_config;
    void initUI();
    void initChat();
    void initSpeechSyn();
    static void chatCallback(ChatResult *chat_result, void *user_data);
    void updateChatHistory(const QString &role, const QString &message);

    void updateHistoryDir();

    void textEditRender();

private:
    QHBoxLayout *layout;
    QVBoxLayout *historyLayout;
    QVBoxLayout *mainLayout;
    QHBoxLayout *chatLayout;
    QHBoxLayout *buttonLayout;
    QHBoxLayout *inputLayout;

    QWidget *centralWidget;

    QTextEdit *chatHistory;

    QTextCursor *chatHistoryCursor;

    ChatTextEdit *inputField;

    QPushButton *sendButton;
    QPushButton *saveButton;

    QPushButton *visionButton;

    QPushButton *micButton;

    GenAiTextSession *chatSession;

    QString currentResponse;  // 用于缓存当前的回答
    bool isGenerating;       // 标记是否正在生成回答
    int lastResponseLine;    // 记录最后一次响应的行号
    ChatMessage *historyMessages;  // 历史消息对象

    SpeechManager *m_speechManager;

    SpeechSynthesizer *m_speechSynthesizer;
    QString m_fullAssistantResponse; // 累积完整回复
    bool m_isFirstResponseSegment = true; // 标记是否第一段

    QString historyDirPath=QDir::currentPath() + "/KyAiData/KyAiHistory";
    QFileSystemWatcher *historyDirWatcher;

    VisionManager *m_visionManager;

//signals:

};

#endif // CHATWINDOW_H
